package com.example.utils;

import org.springframework.util.StringUtils;

/**
 * 数据脱敏工具类
 * 提供对敏感信息进行脱敏处理的方法
 *
 * @author zhexueqi
 * @since 2024/4/12
 */
public class MaskingUtils {

    /**
     * 对身份证号进行脱敏处理
     * 1. 身份证号只保留前三位和后三位，中间部分用*代替
     * 2. 如果身份证长度小于等于10位，则只保留前面2位和后面两位
     *
     * @param idNumber 原始身份证号
     * @return 脱敏后的身份证号
     */
    public static String maskIdNumber(String idNumber) {
        if (!StringUtils.hasText(idNumber)) {
            return "";
        }
        
        int length = idNumber.length();
        if (length <= 10) {
            // 短身份证号，保留前2位和后2位
            if (length <= 4) {
                return idNumber; // 太短的情况下不做脱敏
            }
            return idNumber.substring(0, 2) + "*".repeat(length - 4) + idNumber.substring(length - 2);
        } else {
            // 标准身份证号，保留前3位和后3位
            return idNumber.substring(0, 3) + "*".repeat(length - 6) + idNumber.substring(length - 3);
        }
    }

    /**
     * 对联系电话进行脱敏处理
     * 1. 联系电话只保留前3位和后4位，中间部分用*代替
     * 2. 如果电话长度小于等于7位，那么就只保留前三位和后一位
     *
     * @param phone 原始联系电话
     * @return 脱敏后的联系电话
     */
    public static String maskPhone(String phone) {
        if (!StringUtils.hasText(phone)) {
            return "";
        }
        
        int length = phone.length();
        if (length <= 7) {
            // 短电话号码，保留前3位和后1位
            if (length <= 4) {
                return phone; // 太短的情况下不做脱敏
            }
            return phone.substring(0, 3) + "*".repeat(length - 4) + phone.substring(length - 1);
        } else {
            // 标准电话号码，保留前3位和后4位
            return phone.substring(0, 3) + "*".repeat(length - 7) + phone.substring(length - 4);
        }
    }

    /**
     * 对电子邮箱进行脱敏处理
     * 1. 电子邮箱只保留前3位和@后面的部分，其余部分用*代替
     * 2. 如果邮箱长度（@前面的部分）小于等于5的话，只保留前2位
     *
     * @param email 原始电子邮箱
     * @return 脱敏后的电子邮箱
     */
    public static String maskEmail(String email) {
        if (!StringUtils.hasText(email)) {
            return "";
        }
        
        int atIndex = email.indexOf('@');
        if (atIndex <= 0) {
            return email; // 不是有效的邮箱格式
        }
        
        String localPart = email.substring(0, atIndex);
        String domainPart = email.substring(atIndex);
        
        if (localPart.length() <= 5) {
            // 短邮箱名，保留前2位
            if (localPart.length() <= 2) {
                return localPart + domainPart; // 太短的情况下不做脱敏
            }
            return localPart.substring(0, 2) + "*".repeat(localPart.length() - 2) + domainPart;
        } else {
            // 标准邮箱名，保留前3位
            return localPart.substring(0, 3) + "*".repeat(localPart.length() - 3) + domainPart;
        }
    }

    /**
     * 对钱包地址进行脱敏处理
     * 1. 钱包地址只保留前6个和最后4个，其余用...代替
     * 2. 如果地址长度小于等于5，则保留前2位和最后一位
     *
     * @param address 原始钱包地址
     * @return 脱敏后的钱包地址
     */
    public static String maskWalletAddress(String address) {
        if (!StringUtils.hasText(address)) {
            return "";
        }
        
        int length = address.length();
        if (length <= 5) {
            // 短地址，保留前2位和后1位
            if (length <= 3) {
                return address; // 太短的情况下不做脱敏
            }
            return address.substring(0, 2) + "..." + address.substring(length - 1);
        } else {
            // 标准地址，保留前6位和后4位
            return address.substring(0, 6) + "..." + address.substring(length - 4);
        }
    }
}